#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string>
#include<cstring>
#include"Thread.hpp"
#include<pthread.h>
#include"Common.hpp"
#include"InetAddr.hpp"
#include<unistd.h>


using namespace ThreadModule;

void Usage(std::string proc)
{
    std::cerr<<"Usage: "<<proc<<" server_ip server_port"<<std::endl;
}

//./tcpclient server_ip server_port
int main(int argc ,char* argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
       exit(USEAGE_ERR);
    }
    std::string server_ip = argv[1];
    uint16_t server_port = std::stoi(argv[2]);

    //1.创建socket
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0)
    {
        std::cerr<<"socket error"<<std::endl;
        exit(SOCKET_ERR);
    }

    //需要bind吗？需要，但是不需要显示绑定，随机方式选择端口号
    //我们需要做什么？listen？accept？都不需要！
    //直接向目标服务器发送链接的请求

    InetAddr serveraddr(server_ip,server_port);
    int n = connect(sockfd,serveraddr.NetAddrPtr(),serveraddr.NetAddrLen());
    //connect成功后，套接字与服务器建立了双向通信的信道，此时套接字代表的是整个通信链路，而不仅仅是客户端
    if(n<0)
    {
        std::cerr<<"connect error"<<std::endl;
        exit(CONNECT_ERR);
    }


    while(true)
    {
        std::string input;
        std::cout<<"Please Enter# ";
        std::getline(std::cin,input);

        write(sockfd,input.c_str(),input.size());

        char buffer[1024];
        ssize_t m = read(sockfd,buffer,sizeof(buffer)-1);
        if(m>0)
        {
            buffer[m] = 0;
            std::cout<<"server echo# "<<buffer<<std::endl;
        }
    }

    close(sockfd);

    return 0;
}